# -*- coding:utf-8 -*-
__author__ = 'Dragon Sun'
__date__ = '2025-06-25 07:51:44'

from pathlib import Path
from typing import Optional

from PySide6.QtCore import QObject, Qt, QRegularExpression
from PySide6.QtGui import QRegularExpressionValidator
from PySide6.QtWidgets import QGroupBox, QCheckBox, QLineEdit
from dsPySide6.utils.func import load_ui
from dsPySide6.utils.helper import 设置分组框激活状态


class 提示音设置视图控制器类(QObject):

    # noinspection PyUnresolvedReferences
    def __init__(self):
        super().__init__()

        # 视图
        视图文件名 = Path(__file__).resolve().parent / '提示音设置视图.ui'
        self.视图 = load_ui(ui_file=视图文件名, custom_widgets=[], parent=None)

        # 组件映射
        self._分组框: QGroupBox = self.视图.groupBox
        self._异常检查框: QCheckBox = self.视图.cbYiChang
        self._已获取检查框: QCheckBox = self.视图.cbYiHuoQu
        self._顺向检查框: QCheckBox = self.视图.cbShunXiang
        self._逆向检查框: QCheckBox = self.视图.cbNiXiang
        self._放量检查框: QCheckBox = self.视图.cbFangLiang
        self._大K线检查框: QCheckBox = self.视图.cbDaKXian
        self._锤头线检查框: QCheckBox = self.视图.cbChuiTouXian
        self._跨均线检查框: QCheckBox = self.视图.cbKuaJunXian
        self._分型检查框: QCheckBox = self.视图.cbFenXing
        self._RSI超买超卖检查框: QCheckBox = self.视图.cbRSI
        self._MACD金叉检查框: QCheckBox = self.视图.cbMACDJinCha
        self._MACD死叉检查框: QCheckBox = self.视图.cbMACDSiCha
        self._MACD顶背离检查框: QCheckBox = self.视图.cbMACDDingBeiLi
        self._MACD底背离检查框: QCheckBox = self.视图.cbMACDDiBeiLi
        self._破上轨检查框: QCheckBox = self.视图.cbPoShangGui
        self._破下轨检查框: QCheckBox = self.视图.cbPoXiaGui
        self._上轨文本框: QLineEdit = self.视图.edtShangGui
        self._下轨文本框: QLineEdit = self.视图.edtXiaGui
        self._静音检查框: QCheckBox = self.视图.cbJingYin

        # 组件事件
        self._破上轨检查框.checkStateChanged.connect(self._上下轨检查框_状态改变)
        self._破下轨检查框.checkStateChanged.connect(self._上下轨检查框_状态改变)
        self._上轨文本框.textChanged.connect(self._上下轨文本框_内容改变)
        self._下轨文本框.textChanged.connect(self._上下轨文本框_内容改变)
        self._静音检查框.checkStateChanged.connect(self._静音检查框_状态改变)

        # 组件初始设置
        # 让自定义价格文本框只能输入价格(最多6位整数2位小数)
        #     不支持前面加正负号
        #     整数部分0-6位（0或1-999999）
        #     小数部分可选，若有则必须有1-2位
        #     支持标准格式（如123.45）和简写格式（如.12或0.12）
        #     禁止多余前导零（如001.23不合法）
        正则表达式 = r'^(?:0(?:\.\d{1,2})?|[1-9]\d{0,5}(?:\.\d{1,2})?|\.\d{1,2})$'
        正则对象 = QRegularExpression(正则表达式)
        验证器 = QRegularExpressionValidator(正则对象)
        self._上轨文本框.setValidator(验证器)
        self._下轨文本框.setValidator(验证器)

    @property
    def 异常提示音状态(self) -> bool:
        return self._异常检查框.isChecked()

    @property
    def 已获取提示音状态(self) -> bool:
        return self._已获取检查框.isChecked()

    @property
    def 顺向提示音状态(self) -> bool:
        return self._顺向检查框.isChecked()

    @property
    def 逆向提示音状态(self) -> bool:
        return self._逆向检查框.isChecked()

    @property
    def 放量提示音状态(self) -> bool:
        return self._放量检查框.isChecked()

    @property
    def 大K线提示音状态(self) -> bool:
        return self._大K线检查框.isChecked()

    @property
    def 锤头线提示音状态(self) -> bool:
        return self._锤头线检查框.isChecked()

    @property
    def 跨均线提示音状态(self) -> bool:
        return self._跨均线检查框.isChecked()

    @property
    def 分型提示音状态(self) -> bool:
        return self._分型检查框.isChecked()

    @property
    def RSI超买超卖提示音状态(self) -> bool:
        return self._RSI超买超卖检查框.isChecked()

    @property
    def MACD金叉提示音状态(self) -> bool:
        return self._MACD金叉检查框.isChecked()

    @property
    def MACD死叉提示音状态(self) -> bool:
        return self._MACD死叉检查框.isChecked()

    @property
    def MACD顶背离提示音状态(self) -> bool:
        return self._MACD顶背离检查框.isChecked()

    @property
    def MACD底背离提示音状态(self) -> bool:
        return self._MACD底背离检查框.isChecked()

    @property
    def 破上轨提示音状态(self) -> bool:
        return self._破上轨检查框.isChecked()

    @property
    def 破下轨提示音状态(self) -> bool:
        return self._破下轨检查框.isChecked()

    @property
    def 静音状态(self) -> bool:
        return self._静音检查框.isChecked()

    @property
    def 上轨数值(self) -> Optional[float]:
        if self.破上轨提示音状态:
            数值文本 = self._上轨文本框.text().strip()
            try:
                数值 = float(数值文本)
                return 数值
            except ValueError:
                return None
        return None

    @property
    def 下轨数值(self) -> Optional[float]:
        if self.破下轨提示音状态:
            数值文本 = self._下轨文本框.text().strip()
            try:
                数值 = float(数值文本)
                return 数值
            except ValueError:
                return None
        return None

    def _上下轨检查框_状态改变(self, state: Qt.CheckState):
        sender = self.sender()
        if sender == self._破上轨检查框:
            self._上轨文本框.setEnabled(state != Qt.CheckState.Checked)
        if sender == self._破下轨检查框:
            self._下轨文本框.setEnabled(state != Qt.CheckState.Checked)

    def _上下轨文本框_内容改变(self, text: str):
        try:
            float(text)
            为浮点数 = True
        except ValueError:
            为浮点数 = False

        sender = self.sender()
        if sender == self._上轨文本框:
            self._破上轨检查框.setEnabled(为浮点数)
        if sender == self._下轨文本框:
            self._破下轨检查框.setEnabled(为浮点数)

    def _静音检查框_状态改变(self, state: Qt.CheckState):
        激活状态 = (state == Qt.CheckState.Unchecked)
        设置分组框激活状态(分组框=self._分组框, 激活状态=激活状态)
